package com.haoniu.module.service.impl;

import com.alibaba.fastjson.JSON;
import com.haoniu.common.service.impl.RedisService2;
import com.haoniu.common.support.Convert;
import com.haoniu.common.util.RedPacketFree;
import com.haoniu.common.utils.StringUtils;
import com.haoniu.module.domain.database.RedWelfareBag;
import com.haoniu.module.domain.database.RedWelfareBagUser;
import com.haoniu.module.domain.database.User;
import com.haoniu.module.mapper.RedWelfareBagMapper;
import com.haoniu.module.mapper.RedWelfareBagUserMapper;
import com.haoniu.module.mapper.UserMapper;
import com.haoniu.module.service.RedWelfareBagService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * 福利包服务层实现
 * 
 * @author houyijun
 * @date 2019-04-21
 */
@Service
public class RedWelfareBagServiceImpl implements RedWelfareBagService
{
	@Autowired
	private RedWelfareBagMapper redWelfareBagMapper;

	@Autowired
	private RedisService2 redisService;

	@Autowired
	private UserMapper userMapper;

	@Autowired
	private RedWelfareBagUserMapper bagUserMapper;

	/**
     * 查询福利包信息
     * 
     * @param id 福利包ID
     * @return 福利包信息
     */
    @Override
	public RedWelfareBag selectRedWelfareBagById(Integer id) {
	    return redWelfareBagMapper.selectRedWelfareBagById(id);
	}
	
	/**
     * 查询福利包列表
     * 
     * @param redWelfareBag 福利包信息
     * @return 福利包集合
     */
	@Override
	public List<RedWelfareBag> selectRedWelfareBagList(RedWelfareBag redWelfareBag) {
	    return redWelfareBagMapper.selectRedWelfareBagList(redWelfareBag);
	}

    /**
     * 新增福利包
     *
     * @param redWelfareBag 福利包信息
     * @return 结果
     */
	@Override
	@Transactional
	public int insertRedWelfareBag(RedWelfareBag redWelfareBag) {
		if(redWelfareBag.getBeginTime() == null){
			throw new RuntimeException("未获取到福利包开始时间");
		}
		if(redWelfareBag.getEndTime() == null){
			throw new RuntimeException("未获取到福利包结束时间");
		}
		if(redWelfareBag.getBeginTime().getTime() < new Date().getTime()){
			throw new RuntimeException("福利包开始时间不能小于当前时间");
		}
		if(redWelfareBag.getEndTime().getTime() <= redWelfareBag.getBeginTime().getTime()){
			throw new RuntimeException("福利包结束时间不能小于福利包开始时间");
		}
		if(redWelfareBag.getBagNum() == null || redWelfareBag.getBagNum() < 1){
			throw new RuntimeException("红包数量不能为空或者小于1");
		}
		if(redWelfareBag.getBagMoney() == null || redWelfareBag.getBagMoney().intValue() < 1){
			throw new RuntimeException("红包金额不能为空或者小于1");
		}
		redWelfareBag.setBagTime(new Date());
		redWelfareBag.setDelFlag(0);
		// 发包记录到表中
	    int res = redWelfareBagMapper.insertRedWelfareBag(redWelfareBag);
	    // 最近登录的bagNum 人
		List<User> userIds = userMapper.findLimitUserIds(redWelfareBag.getBagNum());
		// 计算包放到redis中的时间
		long time1 = redWelfareBag.getBeginTime().getTime() - new Date().getTime();
		long time2 = redWelfareBag.getEndTime().getTime() - redWelfareBag.getBeginTime().getTime();
		long time3 = time1 + time2 + (1000 * 60 * 60 * 24);
		// 拆包放包
		if(userIds != null && !userIds.isEmpty()){
			List<String> valueStr = RedPacketFree.splitRedPacketFree(redWelfareBag.getBagMoney().intValue(),redWelfareBag.getBagNum());
			if(valueStr != null && !valueStr.isEmpty()){
				for(int i = 0 ; i < userIds.size() ; i++){
					User user = userIds.get(i);
					Integer userId = user != null ? user.getId() : null;
					if(userId != null && (valueStr.size() - 1) >= i && StringUtils.isNotEmpty(valueStr.get(i)) && new BigDecimal(valueStr.get(i)).doubleValue() > 0 ){
						// 分钱
						RedWelfareBagUser bagUser = new RedWelfareBagUser();
						bagUser.setUserId(userId);
						bagUser.setBagMoney(new BigDecimal(valueStr.get(i)));
						bagUser.setBagTime(new Date());
						bagUser.setBagId(redWelfareBag.getId());
						bagUser.setStatus("0");
						bagUser.setDelFlag(0);
						bagUserMapper.insertRedWelfareBagUser(bagUser);
						// 当前包的当前用户放到redis中
						redisService.set("redWelfareBagUser_" + redWelfareBag.getId() + "_" + userId,JSON.toJSONString(bagUser),time3,TimeUnit.SECONDS);
					}
				}
				// 钱分完了,放redis中,等抢
				redisService.set("redWelfareBag_" + redWelfareBag.getId(), JSON.toJSONString(redWelfareBag) , time3, TimeUnit.SECONDS);
			}
		}

	    return res;
	}

	
	/**
     * 修改福利包
     *
     * @param redWelfareBag 福利包信息
     * @return 结果
     */
	@Override
	public int updateRedWelfareBag(RedWelfareBag redWelfareBag) {
	    return redWelfareBagMapper.updateRedWelfareBag(redWelfareBag);
	}

	/**
     * 删除福利包对象
     * 
     * @param ids 需要删除的数据ID
     * @return 结果
     */
	@Override
	public int deleteRedWelfareBagByIds(String ids) {
		return redWelfareBagMapper.deleteRedWelfareBagByIds(Convert.toStrArray(ids));
	}
	
}
